/*
 * JOY电子商务网运营事业部
 * 中国移动通信集团设计院有限公司
 * B2BJOY.COM  OPERATION  DIVISION
 * China Mobile Group Design Institute Co., Ltd
 */

package com.uhaou.system.service.impl;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.*;

import org.apache.commons.lang.StringUtils;

import com.uhaou.common.base.*;
import com.uhaou.common.util.*;

import cn.org.rapid_framework.util.*;
import cn.org.rapid_framework.web.util.*;
import cn.org.rapid_framework.page.*;
import cn.org.rapid_framework.page.impl.*;

import com.uhaou.system.model.*;
import com.uhaou.system.dao.*;
import com.uhaou.system.service.*;
import com.uhaou.system.vo.query.*; 

/**
 * @author  jiangcheng
 * @version 1.0
 * @since 1.0
 */


@Service("sysFunctionManager")
@Transactional
public class SysFunctionManagerImpl extends BaseManager<SysFunction,java.lang.String> implements ISysFunctionManager{

	private ISysFunctionDao sysFunctionDao;
	/**增加setXXXX()方法,spring就可以通过autowire自动设置对象属性,请注意大小写*/
	public void setSysFunctionDao(ISysFunctionDao dao) {
		this.sysFunctionDao = dao;
	}
	public EntityDao getEntityDao() {
		return (EntityDao)this.sysFunctionDao;
	}
	
	@Transactional(readOnly=true)
	public Page findPage(SysFunctionQuery query) {
		return sysFunctionDao.findPage(query);
	}
	@Transactional(readOnly=true)
	public SysFunction getById(java.lang.String id){
		return super.getById( id);
	}
	
	/**
	 * 根据父权限编码获得所有子节点权限（包括子权限的子权限）
	 * @param parentCode
	 * @return List<TsysDept>
	 *  add by  zhanghao
	 */
	@Transactional(readOnly=true)
	public List<SysFunction> getFuncnodeList(String parentCode){
		SysFunctionQuery query = new SysFunctionQuery ();
		query.setFuncCode(parentCode);
		query.setDeleted("0");
		return this.sysFunctionDao.getFuncnodeList(query);
	}
	
	
	/**
	 *删除权限时同步删除子权限。。。都为逻辑删除
	 *update by zhanghao
	 */
	@Transactional
	public void removeById(java.lang.String id){
		SysFunction entity = this.getById(id);
		List<SysFunction> list = this.getFuncnodeList(entity.getFuncCode());
		for (int i = 0; i < list.size(); i++) {
			SysFunction tsf = list.get(i);
			tsf.setDeleted("1");
			this.sysFunctionDao.update(tsf);
		}
		//super.removeById(id);
	}
	
	/** 插入数据 */
	@Transactional
	public void save(SysFunction entity){
		super.save(entity);
	}
	
	/** 更新数据 */
	@Transactional
	public void update(SysFunction entity){
		super.update(entity);
	}
	@Transactional(readOnly=true)
	public boolean isUnique(SysFunction entity, String uniquePropertyNames){
		return super.isUnique( entity, uniquePropertyNames);
	}
	@Transactional(readOnly=true)
	public List<SysFunction> findAll(){
		return super.findAll();
	}
	@Transactional
	public void saveOrUpdate(SysFunction entity) {
		super.saveOrUpdate(entity);
	}

	/**
	 * 根据父权限ID和父权限编码得到当前子权限的权限编码
	 * @param parentId 父权限ID
	 * @param parentCode 父权限编码
	 * @return String code
	 * @author zhanghao
	 */
	@Transactional(readOnly=true)
	public String getCode(String parentId, String parentCode) {
		SysFunction dept = (SysFunction) sysFunctionDao.getById(parentId);
		
		int deflength = 3;//生成默认长度的字符串。
		
		SysFunctionQuery query = new SysFunctionQuery();
		query.setParentId(parentId);
		query.setPageSize(10000);
//		query.setDeleted("0"); //这里查询所有的记录，包括已删除的记录。。这样保证取到的是最大权限code，可以避免重复的deptcode
		Page p =sysFunctionDao.findPage(query);
		List list = p.getResult();
		
		List newList = new ArrayList();
		for (int i = 0; i < list.size(); i++) {
			newList.add(((SysFunction)list.get(i)).getFuncCode());
		}
		int lisize =newList.size()+1;
		String funcCode = parentCode+this.getStringbycode(lisize, deflength);
		
		
		while (newList.contains(funcCode)){//如果此编码已经存在则重新生成编码--编码数字+1
			lisize++;
			funcCode = parentCode+this.getStringbycode(lisize, deflength);
		}
		
		if(funcCode.indexOf("false")>0){//有可能存在001002false这种情况的编码
			return "false";
		}
		
		
		return funcCode;
	}
	
	/**
	 * 根据数字编码生成strlength(默认是3)位的字符串。。。不足strlength位的用0不齐。。。如：1-->001;25-->025。。。。
	 * @param deptCode 	要生成字符串的基础数字
	 * @param strlength	要生成几位字符串的定义。。。默认是3
	 * @return String 
	 * @author zhanghao
	 */
	private String getStringbycode(int deptCode,int strlength){
		if(strlength==0)
			strlength=3;
		
		String codestr = deptCode+"";
		
		if (codestr.length()>strlength)
			//return "要生成的编码超出了最大编码长度！";
			return "false";
		
		for(int i=0;i<=strlength-codestr.length();i++){
			codestr="0"+codestr;
		}
		return codestr;
	}
	
	/**
	 * 查询用户所拥有的权限
	 * mayunbo
	 */
	@Transactional(readOnly=true)
	public List<SysFunction> getUserFunc(String userName) {
		List <SysFunction> funcList = sysFunctionDao.getUserFunc(userName);
		return funcList;
	}
}
